home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / t_os / magl / effect.asm next >
Assembly Source File  |  1991-10-18  |  11KB  |  681 lines

  1. ;
  2. ;    effect display functions for 'Magl.exp'
  3. ;
  4. ;            programmed by MALOR
  5. ;
  6.     .386p
  7.  
  8. HeaderSize    equ    32/4
  9. Plane2    equ    0104h
  10. Plane1    equ    010ch
  11.  
  12. CODE    segment dword public use32 'CODE'
  13.     assume cs:CODE,ds:DATA
  14.  
  15. ;void falcom(int xbyte,int sy,int sofs,int slofs,int dseg,int dofs,int dlofs);
  16.     public falcom
  17.     db    'falcom',6
  18.     align    4
  19. falcom    proc
  20.  
  21.     pushad
  22.  
  23.     mov    eax,ss:[esp+36+0]        ;x loop count
  24.     mov    ds:[xloopc],eax
  25.     mov    eax,ss:[esp+36+4]        ;y loop count
  26.     mov    ds:[yloopc],eax
  27.     mov    esi,ss:[esp+36+8]        ;souce offset
  28.     mov    ds:[sofs],esi
  29.     mov    eax,ss:[esp+36+12]        ;souce 1line offset
  30.     mov    ds:[slofs],eax
  31.     mov    eax,ss:[esp+36+16]        ;dest. selecter
  32.     mov    es,ax
  33.     mov    edi,ss:[esp+36+20]        ;dest. offset
  34.     mov    ds:[vofs],edi
  35.     mov    eax,ss:[esp+36+24]        ;dest. 1line offset
  36.     mov    ds:[vlofs],eax
  37.  
  38.     xor    ebx,ebx
  39.     align    4
  40. #loop1:    mov    edi,ds:[vofs]
  41.     mov    edx,ds:[yloopc]
  42.     sub    edx,ebx
  43.     align    4
  44. #loop2:    mov    ecx,ds:[xloopc]
  45.     shr    ecx,2
  46.     rep movsd
  47.     mov    ecx,ds:[xloopc]
  48.     and    ecx,3
  49.     rep movsb
  50.  
  51.     sub    esi,ds:[xloopc]
  52.     sub    edi,ds:[xloopc]
  53.     sub    edi,ds:[vlofs]
  54.  
  55.     dec    edx
  56.     jnz    short #loop2
  57.  
  58.     add    esi,ds:[slofs]
  59.  
  60.     add    edi,ds:[vlofs]
  61.     add    edi,ds:[vlofs]
  62.  
  63.     mov    ecx,ds:[xloopc]        ;2ライン毎にしてしまえ!
  64.     shr    ecx,2
  65.     rep movsd
  66.     mov    ecx,ds:[xloopc]
  67.     and    ecx,3
  68.     rep movsb
  69.  
  70.     sub    esi,ds:[xloopc]
  71.     add    esi,ds:[slofs]
  72.  
  73.     add    ebx,2
  74. ;    inc    ebx
  75.     cmp    ebx,ds:[yloopc]
  76.     jb    short #loop1
  77. ;    jne    short #loop1
  78.  
  79.     mov    ax,ds
  80.     mov    es,ax
  81.  
  82.     popad
  83.  
  84.     ret
  85.  
  86. falcom    endp
  87.  
  88. ;void slide(int xbyte,int sy,int sofs,int slofs,int dseg,int dofs,int dlofs);
  89.     public slide
  90.     db    'slide',5
  91.     align    4
  92. slide    proc
  93.  
  94.     pushad
  95.  
  96.     mov    eax,ss:[esp+36+0]        ;x loop count
  97.     mov    ds:[xloopc],eax
  98.     mov    eax,ss:[esp+36+4]        ;y loop count
  99.     mov    ds:[yloopc],eax
  100.     mov    esi,ss:[esp+36+8]        ;souce offset
  101.     mov    ds:[sofs],esi
  102.     mov    eax,ss:[esp+36+12]        ;souce 1line offset
  103.     mov    ds:[slofs],eax
  104.     mov    eax,ss:[esp+36+16]        ;dest. selecter
  105.     mov    es,ax
  106.     mov    edi,ss:[esp+36+20]        ;dest. offset
  107.     mov    ds:[vofs],edi
  108.     mov    eax,ss:[esp+36+24]        ;dest. 1line offset
  109.     mov    ds:[vlofs],eax
  110.  
  111.     mov    ebx,0
  112.     align    4
  113. #loop1:    inc    ebx
  114.     mov    edi,ds:[vofs]
  115.     mov    esi,ds:[sofs]
  116.     add    esi,ds:[xloopc]
  117.     sub    esi,ebx
  118.     mov    edx,ds:[yloopc]
  119.     align    4
  120. #loop2:    mov    ecx,ebx
  121.     shr    ecx,2
  122.     rep movsd
  123.     mov    ecx,ebx
  124.     and    ecx,3
  125.     rep movsb
  126.     sub    esi,ebx
  127.     add    esi,ds:[slofs]
  128.     add    esi,ds:[slofs]
  129.     sub    edi,ebx
  130.     add    edi,ds:[vlofs]
  131.     add    edi,ds:[vlofs]
  132.     sub    edx,2
  133.     ja    #loop2
  134.  
  135.     mov    esi,ds:[sofs]
  136.     add    esi,ds:[slofs]
  137.     mov    edi,ds:[vofs]
  138.     add    edi,ds:[vlofs]
  139.     add    edi,ds:[xloopc]
  140.     sub    edi,ebx
  141.     mov    edx,ds:[yloopc]
  142.     dec    edx
  143.     align    4
  144. #loop3:    mov    ecx,ebx
  145.     shr    ecx,2
  146.     rep movsd
  147.     mov    ecx,ebx
  148.     and    ecx,3
  149.     rep movsb
  150.     sub    esi,ebx
  151.     add    esi,ds:[slofs]
  152.     add    esi,ds:[slofs]
  153.     sub    edi,ebx
  154.     add    edi,ds:[vlofs]
  155.     add    edi,ds:[vlofs]
  156.     sub    edx,2
  157.     ja    short #loop3
  158.  
  159. ;    cmp    ebx,ds:[xloopc]        ;1ドット毎のHigh-quality Version
  160. ;    jne    #loop1
  161.  
  162.     add    ebx,7            ;8ドット毎だけど実用的な速さVersion
  163.     cmp    ebx,ds:[xloopc]
  164.     jb    #loop1
  165.  
  166.     mov    ax,ds
  167.     mov    es,ax
  168.  
  169.     popad
  170.  
  171.     ret
  172.  
  173. slide    endp
  174.  
  175. ;void sima2(int xbyte,int sy,int sofs,int slofs,int dseg,int dofs,int dlofs,int step);
  176.  
  177.     public sima2
  178.     db    'sima2',5
  179.     align    4
  180. sima2    proc
  181.  
  182.     pushad
  183.  
  184.     mov    eax,ss:[esp+36+0]        ;x loop count
  185.     mov    ds:[xloopc],eax
  186.     mov    eax,ss:[esp+36+4]        ;y loop count
  187.     mov    ds:[yloopc],eax
  188.     mov    esi,ss:[esp+36+8]        ;souce offset
  189.     mov    ds:[sofs],esi
  190.     mov    eax,ss:[esp+36+12]        ;souce 1line offset
  191.     mov    ds:[slofs],eax
  192.     mov    eax,ss:[esp+36+16]        ;dest. selecter
  193.     mov    es,ax
  194.     mov    edi,ss:[esp+36+20]        ;dest. offset
  195.     mov    ds:[vofs],edi
  196.     mov    eax,ss:[esp+36+24]        ;dest. 1line offset
  197.     mov    ds:[vlofs],eax
  198.     mov    eax,ss:[esp+36+28]        ;dest. 1line offset
  199.     mov    ds:[step],eax
  200.  
  201.     mov    eax,ds:[yloopc]
  202.     mul    ds:[xloopc]
  203.     mov    ecx,eax
  204.     mov    ebp,eax
  205.     xor    ebx,ebx
  206.     align    4
  207. #loop1:    add    ebx,ds:[step]
  208.     cmp    ecx,ebx
  209.     jnc    #next
  210.     sub    ebx,ecx
  211.     align    4
  212. #next:    movsb
  213.     mov    eax,ebx
  214.     div    ds:[xloopc]
  215.     mov    esi,ds:[sofs]
  216.     add    esi,edx
  217.     mov    edi,ds:[vofs]
  218.     add    edi,edx
  219.     push    eax
  220.     mul    ds:[slofs]
  221.     add    esi,eax
  222.     pop    eax
  223.     mul    ds:[vlofs]
  224.     add    edi,eax
  225.     dec    ebp
  226.     jnz    #loop1
  227.  
  228.     mov    ax,ds
  229.     mov    es,ax
  230.  
  231.     popad
  232.  
  233.     ret
  234.  
  235. sima2    endp
  236.  
  237. ;void mosaic(int xbyte,int sy,int sofs,int slofs,int dseg,int dofs,int dlofs,int dx,int dy,int midofs);
  238.     public mosaic
  239.     db    'mosaic',5
  240.     align    4
  241. mosaic    proc
  242.  
  243.     pushad
  244.  
  245.     mov    eax,ss:[esp+36+0]        ;x loop count
  246.     mov    ds:[xloopc],eax
  247.     mov    eax,ss:[esp+36+4]        ;y loop count
  248.     mov    ds:[yloopc],eax
  249.     mov    esi,ss:[esp+36+8]        ;souce offset
  250.     mov    ds:[sofs],esi
  251.     mov    eax,ss:[esp+36+12]        ;souce 1line offset
  252.     mov    ds:[slofs],eax
  253.     mov    eax,ss:[esp+36+16]        ;dest. selecter
  254.     mov    fs,ax
  255.     mov    edi,ss:[esp+36+20]        ;dest. offset
  256.     mov    ds:[vofs],edi
  257.     mov    eax,ss:[esp+36+24]        ;dest. 1line offset
  258.     mov    ds:[vlofs],eax
  259.     mov    ebp,ss:[esp+36+28]        ;mosaic xsize
  260.     mov    ds:[dxloopc],ebp
  261.     mov    eax,ss:[esp+36+32]        ;mosaic ysize
  262.     mov    ds:[dyloopc],eax
  263.     mov    eax,ss:[esp+36+36]        ;mosaic middle offset
  264.     mov    ds:[midofs],eax
  265.  
  266.     mov    edx,ds:[yloopc]
  267.  
  268. #loop1:
  269.     cmp    edx,ds:[dyloopc]
  270.     jnb    #next1
  271.     mov    ds:[dyloopc],edx
  272. #next1:    
  273.     mov    ax,ds
  274.     mov    es,ax
  275.  
  276.     mov    ebp,ds:[dxloopc]
  277.     mov    edi,offset linebuf
  278.     mov    eax,ds:[xloopc]
  279.     mov    ds:[xloopc1],eax
  280.     align    4
  281. #loop2:    cmp    ds:[xloopc1],ebp
  282.     jnb    #next2
  283.     mov    ebp,ds:[xloopc1]
  284. #next2:
  285.  
  286.     add    esi,ds:[midofs]
  287.     mov    al,ds:[esi]
  288.     sub    esi,ds:[midofs]
  289.     mov    ah,al
  290.     and    al,0fh
  291.     shl    ah,4
  292.     or    al,ah
  293.     mov    ah,al
  294.     movzx    ebx,ax
  295.     shl    eax,16
  296.     or    eax,ebx                ;eax = alalalal  :-)
  297.  
  298.     mov    ecx,ebp
  299.     shr    ecx,2
  300.     rep stosd
  301.     mov    ecx,ebp
  302.     and    ecx,3
  303.     rep stosb
  304.  
  305.     add    esi,ebp
  306.  
  307.     sub    ds:[xloopc1],ebp
  308.     jnz    short #loop2
  309.  
  310.     mov    ax,fs
  311.     mov    es,ax
  312.  
  313.     mov    ebx,ds:[dyloopc]
  314.     mov    edi,ds:[vofs]
  315. #loop3:    mov    esi,offset linebuf
  316.  
  317.     mov    ecx,ds:[xloopc]
  318.     shr    ecx,2
  319.     rep movsd
  320.     mov    ecx,ds:[xloopc]
  321.     and    ecx,3
  322.     rep movsb
  323.  
  324.     mov    edi,ds:[vofs]
  325.     add    edi,ds:[vlofs]
  326.     mov    ds:[vofs],edi
  327.  
  328.     dec    ebx
  329.     jnz    short #loop3
  330.  
  331.     push    edx
  332.     mov    eax,ds:[slofs]
  333.     mul    ds:[dyloopc]
  334.     mov    esi,ds:[sofs]
  335.     add    esi,eax
  336.     mov    ds:[sofs],esi
  337.     pop    edx
  338.  
  339.     sub    edx,ds:[dyloopc]
  340.     jnz    #loop1
  341.  
  342.     mov    ax,ds
  343.     mov    es,ax
  344.     mov    fs,ax
  345.  
  346.     popad
  347.  
  348.     ret
  349.  
  350. mosaic    endp
  351.  
  352. ;void mosaic256(int xbyte,int sy,int sofs,int slofs,int dseg,int dofs,int dlofs,int dx,int dy,int midofs);
  353.     public mosaic256
  354.     db    'mosaic256',9
  355.     align    4
  356. mosaic256    proc
  357.  
  358.     pushad
  359.  
  360.     mov    eax,ss:[esp+36+0]        ;x loop count
  361.     mov    ds:[xloopc],eax
  362.     mov    eax,ss:[esp+36+4]        ;y loop count
  363.     mov    ds:[yloopc],eax
  364.     mov    esi,ss:[esp+36+8]        ;souce offset
  365.     mov    ds:[sofs],esi
  366.     mov    eax,ss:[esp+36+12]        ;souce 1line offset
  367.     mov    ds:[slofs],eax
  368.     mov    eax,ss:[esp+36+16]        ;dest. selecter
  369.     mov    fs,ax
  370.     mov    edi,ss:[esp+36+20]        ;dest. offset
  371.     mov    ds:[vofs],edi
  372.     mov    eax,ss:[esp+36+24]        ;dest. 1line offset
  373.     mov    ds:[vlofs],eax
  374.     mov    ebp,ss:[esp+36+28]        ;mosaic xsize
  375.     mov    ds:[dxloopc],ebp
  376.     mov    eax,ss:[esp+36+32]        ;mosaic ysize
  377.     mov    ds:[dyloopc],eax
  378.     mov    eax,ss:[esp+36+36]        ;mosaic middle offset
  379.     mov    ds:[midofs],eax
  380.  
  381.     mov    edx,ds:[yloopc]
  382.  
  383. #loop1:
  384.     cmp    edx,ds:[dyloopc]
  385.     jnb    #next1
  386.     mov    ds:[dyloopc],edx
  387. #next1:    
  388.     mov    ax,ds
  389.     mov    es,ax
  390.  
  391.     mov    ebp,ds:[dxloopc]
  392.     mov    edi,offset linebuf
  393.     mov    eax,ds:[xloopc]
  394.     mov    ds:[xloopc1],eax
  395.     align    4
  396. #loop2:    cmp    ds:[xloopc1],ebp
  397.     jnb    #next2
  398.     mov    ebp,ds:[xloopc1]
  399. #next2:
  400.  
  401.     add    esi,ds:[midofs]
  402.     mov    al,ds:[esi]
  403.     sub    esi,ds:[midofs]
  404.     mov    ah,al
  405.     mov    bx,ax
  406.     shl    eax,16
  407.     or    eax,ebx                ;eax = alalalal
  408.  
  409.     mov    ecx,ebp
  410.     shr    ecx,2
  411.     rep stosd
  412.     mov    ecx,ebp
  413.     and    ecx,3
  414.     rep stosb
  415.  
  416.     add    esi,ebp
  417.  
  418.     sub    ds:[xloopc1],ebp
  419.     jnz    short #loop2
  420.  
  421.     mov    ax,fs
  422.     mov    es,ax
  423.  
  424.     mov    ebx,ds:[dyloopc]
  425.     mov    edi,ds:[vofs]
  426. #loop3:    mov    esi,offset linebuf
  427.  
  428.     mov    ecx,ds:[xloopc]
  429.     shr    ecx,2
  430.     rep movsd
  431.     mov    ecx,ds:[xloopc]
  432.     and    ecx,3
  433.     rep movsb
  434.  
  435.     mov    edi,ds:[vofs]
  436.     add    edi,ds:[vlofs]
  437.     mov    ds:[vofs],edi
  438.  
  439.     dec    ebx
  440.     jnz    short #loop3
  441.  
  442.     push    edx
  443.     mov    eax,ds:[slofs]
  444.     mul    ds:[dyloopc]
  445.     mov    esi,ds:[sofs]
  446.     add    esi,eax
  447.     mov    ds:[sofs],esi
  448.     pop    edx
  449.  
  450.     sub    edx,ds:[dyloopc]
  451.     jnz    #loop1
  452.  
  453.     mov    ax,ds
  454.     mov    es,ax
  455.     mov    fs,ax
  456.  
  457.     popad
  458.  
  459.     ret
  460.  
  461. mosaic256    endp
  462.  
  463. ;void nijimi(int xbyte,int sy,int sofs,int slofs,int dseg,int dofs,int dlofs);
  464.     public nijimi
  465.     db    'nijimi',6
  466.     align    4
  467. nijimi    proc
  468.  
  469.     pushad
  470.  
  471.     mov    eax,ss:[esp+36+0]        ;x loop count
  472.     mov    ds:[xloopc],eax
  473.     mov    eax,ss:[esp+36+4]        ;y loop count
  474.     mov    ds:[yloopc],eax
  475.     mov    esi,ss:[esp+36+8]        ;souce offset
  476.     mov    ds:[sofs],esi
  477.     mov    eax,ss:[esp+36+12]        ;souce 1line offset
  478.     mov    ds:[slofs],eax
  479.     mov    eax,ss:[esp+36+16]        ;dest. selecter
  480.     mov    es,ax
  481.     mov    edi,ss:[esp+36+20]        ;dest. offset
  482.     mov    ds:[vofs],edi
  483.     mov    eax,ss:[esp+36+24]        ;dest. 1line offset
  484.     mov    ds:[vlofs],eax
  485.  
  486.     mov    edi,ds:[vofs]
  487.     mov    edx,ds:[yloopc]
  488.     align    4
  489. #loop2:    mov    ecx,ds:[xloopc]
  490. #loop1:    lodsb
  491.     mov    ah,al
  492.     mov    bx,ax
  493.     and    ax,0f00fh
  494.     shr    bh,4
  495.     shl    bl,4
  496.     or    ax,bx
  497.     stosw
  498.     loop    #loop1
  499.  
  500.     sub    esi,ds:[xloopc]
  501.     sub    edi,ds:[xloopc]
  502.     sub    edi,ds:[xloopc]
  503.     add    esi,ds:[slofs]
  504.     add    edi,ds:[vlofs]
  505.  
  506.     dec    edx
  507.     jnz    short #loop2
  508.  
  509.     mov    ax,ds
  510.     mov    es,ax
  511.  
  512.     popad
  513.  
  514.     ret
  515.  
  516. nijimi    endp
  517.  
  518. ;int    setpal(int count,int wight,int nwight,char *beforepal,char *afterpal,int start);
  519.  
  520.     public setpal
  521.     db    'setpal',6
  522. setpal    proc
  523.  
  524.     mov    dx,0440h
  525.     mov    al,30
  526.     out    dx,al
  527.     inc    dx
  528.     inc    dx
  529.     in    ax,dx
  530.     and    ax,0c000h
  531.     jz    #exit                ;VSYNCでなければexit
  532.  
  533. #wait:
  534.     in    ax,dx
  535.     and    ax,0c000h
  536.     jnz    short #wait
  537.  
  538.     push    ebx
  539.     push    ebp
  540.     push    esi
  541.     push    edi
  542.     cli
  543.  
  544.     mov    ecx,ss:[esp+20+0]            ;転送色数
  545.     mov    eax,ss:[esp+20+4]            ;基本の重み
  546.     mov    ds:[wight],al
  547.     mov    eax,ss:[esp+20+8]            ;目標の重み
  548.     mov    ds:[nwight],al
  549.     mov    esi,ss:[esp+20+12]            ;基本パレット
  550.     mov    edi,ss:[esp+20+16]            ;目標パレット
  551.     mov    ebp,ss:[esp+20+20]            ;色開始番号
  552.     mov    dx,0fd90h
  553.  
  554.     align    4
  555. #loop:
  556.     mov    dl,90h
  557.     mov    ax,bp
  558.     out    dx,al                ;色番号
  559.     inc    bp
  560.     lodsb
  561.     mul    ds:[wight]
  562.     mov    bx,ax
  563.     mov    al,ds:[edi]
  564.     inc    edi
  565.     mul    ds:[nwight]
  566.     add    bx,ax
  567.     shr    bx,6                ;(apal*wight+bpal*nwight) / 32
  568.     mov    al,bl
  569.     mov    dl,92h
  570.     out    dx,al                ;青
  571.     lodsb
  572.     mul    ds:[wight]
  573.     mov    bx,ax
  574.     mov    al,ds:[edi]
  575.     inc    edi
  576.     mul    ds:[nwight]
  577.     add    bx,ax
  578.     shr    bx,6
  579.     mov    al,bl
  580.     mov    dl,94h
  581.     out    dx,al                ;赤
  582.     lodsb
  583.     mul    ds:[wight]
  584.     mov    bx,ax
  585.     mov    al,ds:[edi]
  586.     inc    edi
  587.     mul    ds:[nwight]
  588.     add    bx,ax
  589.     shr    bx,6
  590.     mov    al,bl
  591.     mov    dl,96h
  592.     out    dx,al                ;緑
  593.     loop    #loop
  594.  
  595.     xor    eax,eax                ;return -1
  596.     dec    eax
  597.     sti
  598.     pop    edi
  599.     pop    esi
  600.     pop    ebp
  601.     pop    ebx
  602. #Exit:
  603.  
  604.     ret
  605.  
  606. setpal    endp
  607.  
  608. ;void cls(int xbyte,int sy,int dseg,int dofs,int dlofs);
  609.     public cls
  610.     db    'cls',3
  611.     align    4
  612. cls    proc
  613.  
  614.     pushad
  615.  
  616.     mov    eax,ss:[esp+36+0]        ;x loop count
  617.     mov    ds:[xloopc],eax
  618.     mov    eax,ss:[esp+36+4]        ;y loop count
  619.     mov    ds:[yloopc],eax
  620.     mov    eax,ss:[esp+36+8]        ;dest. selecter
  621.     mov    es,ax
  622.     mov    edi,ss:[esp+36+12]        ;dest. offset
  623.     mov    ds:[vofs],edi
  624.     mov    eax,ss:[esp+36+16]        ;dest. 1line offset
  625.     mov    ds:[vlofs],eax
  626.  
  627.     xor    eax,eax
  628.     mov    ebx,ds:[yloopc]
  629.     align    4
  630. #loop1:    mov    ecx,ds:[xloopc]
  631.     shr    ecx,2
  632.     rep stosd
  633.     mov    ecx,ds:[xloopc]
  634.     and    ecx,3
  635.     rep stosb
  636.  
  637.     sub    edi,ds:[xloopc]
  638.     add    edi,ds:[vlofs]
  639.  
  640.     dec    ebx
  641.     jnz    #loop1
  642.  
  643.     mov    ax,ds
  644.     mov    es,ax
  645.  
  646.     popad
  647.  
  648.     ret
  649.  
  650. cls    endp
  651.  
  652. CODE    ends
  653.  
  654. DATA    segment dword
  655.     assume ds:DATA
  656.  
  657. xloopc    dd    0
  658. yloopc    dd    0
  659. sofs    dd    0
  660. slofs    dd    0
  661. vofs    dd    0
  662. vlofs    dd    0
  663.  
  664. xloopc1    dd    0
  665. dyloopc    dd    0
  666. dxloopc    dd    0
  667.  
  668. step    dd    23
  669.  
  670. wight    db    0
  671. nwight    db    0
  672.  
  673. midofs    dd    0
  674.  
  675.     align    4
  676. linebuf    db    1024 dup(?)
  677.  
  678. DATA    ends
  679.  
  680.     end
  681.